﻿using System;
using System.Collections.Generic;
using System.Linq;
using StockholmsStad.Web.UI.UIServiceReference;

namespace StockholmsStad.Web.UI.Class.Interfaces
{
    /// <summary>
    /// MVC Model för bokning
    /// </summary>
    public interface IBookingModel
    {
        /// <summary>
        /// Alla tillgängliga ceremonityper. Borde vara Stadshuset och Individuell
        /// </summary>
        IList<ValueIdPair> CeremonyTypes { get; }

        /// <summary>
        /// Alla lediga tider som går att boka för en vigsel i stadshuset. Frågan går inte ned till server,
        /// utan propertien måste sättas explicit.
        /// </summary>
        IOrderedEnumerable<DateTime> CachedFreeTimeblocksOrdinary { get; set; }

        /// <summary>
        /// Alla lediga tider som går att boka för en vigsel på annan plats. Frågan går inte ned till server,
        /// utan propertien måste sättas explicit.
        /// </summary>
        IOrderedEnumerable<DateTime> CachedFreeTimeblocksIndividual { get; set; }

        /// <summary>
        /// Alla bokade dagar som går att sätta som önskat datum. Frågan går inte ned till server,
        /// utan propertien måste sättas explicit.
        /// </summary>
        IOrderedEnumerable<DateTime> CachedBookedTimeblocks { get; set; }

        /// <summary>
        /// Hämtar nuvarande bokning
        /// </summary>
        Booking Booking { get; set; }

        /// <summary>
        /// Alla lediga tider som går att boka för en vigsel
        /// </summary>
        IList<TimeBlock> GetFreeTimeblocks(User user, bool ordinary);

        /// <summary>
        /// Alla bokade dagar som går att sätta som önskat datum
        /// </summary>
        IList<TimeBlock> GetBookedTimeblocks(User user);

        /// <summary>
        /// Sparar av nuvarande bokning till server
        /// </summary>
        void RegisterBooking(User user);

        /// <summary>
        /// Avbokar en befintlig bokning
        /// </summary>
        /// <param name="user"></param>
        void CancelBooking(User user);

        /// <summary>
        /// Hämtar platsnamn utiftån ceremoniid
        /// </summary>
        /// <param name="ceremonyTypeId"></param>
        /// <returns></returns>
        string GetLocationName(int ceremonyTypeId);

        /// <summary>
        /// Hämtar serverinfo och lägger i sessionens Booking
        /// </summary>
        void UpdateBookingFromServer(User user);

        /// <summary>
        /// Returnerar true om bokningskoden matchas av en förrättare
        /// </summary>
        /// <param name="user"></param>
        /// <param name="text"></param>
        /// <returns></returns>
        bool IsBookingCodeValid(User user, string text);

        /// <summary>
        /// Returnerar true om bokningen kan uppdateras från webbapplikationen
        /// </summary>
        /// <returns></returns>
        bool IsUpdateable();
        
    }
}